/*     */ package com.alipay.api.internal.util.json;
/*     */ 
/*     */ import com.alipay.api.internal.mapping.ApiField;
/*     */ import com.alipay.api.internal.mapping.ApiListField;
/*     */ import com.alipay.api.internal.util.AlipayLogger;
/*     */ import java.beans.BeanInfo;
/*     */ import java.beans.IntrospectionException;
/*     */ import java.beans.Introspector;
/*     */ import java.beans.PropertyDescriptor;
/*     */ import java.lang.reflect.Array;
/*     */ import java.lang.reflect.Field;
/*     */ import java.lang.reflect.InvocationTargetException;
/*     */ import java.lang.reflect.Method;
/*     */ import java.text.CharacterIterator;
/*     */ import java.text.DateFormat;
/*     */ import java.text.SimpleDateFormat;
/*     */ import java.text.StringCharacterIterator;
/*     */ import java.util.Collection;
/*     */ import java.util.Date;
/*     */ import java.util.Iterator;
/*     */ import java.util.Map;
/*     */ import java.util.Stack;
/*     */ import java.util.TimeZone;
/*     */ 
/*     */ 
/*     */ 
/*     */ public class JSONWriter
/*     */ {
/*  29 */   private StringBuffer buf = new StringBuffer();
/*  30 */   private Stack<Object> calls = new Stack();
/*     */   private boolean emitClassName = true;
/*     */   private DateFormat format;
/*     */   
/*     */   public JSONWriter(boolean emitClassName) {
/*  35 */     this.emitClassName = emitClassName;
/*     */   }
/*     */   
/*     */   public JSONWriter() {
/*  39 */     this(false);
/*     */   }
/*     */   
/*     */   public JSONWriter(DateFormat format) {
/*  43 */     this(false);
/*  44 */     this.format = format;
/*     */   }
/*     */   
/*     */   public String write(Object object) {
/*  48 */     return write(object, false);
/*     */   }
/*     */   
/*     */   public String write(Object object, boolean isApiModel) {
/*  52 */     this.buf.setLength(0);
/*  53 */     value(object, isApiModel);
/*  54 */     return this.buf.toString();
/*     */   }
/*     */   
/*     */   public String write(long n) {
/*  58 */     return String.valueOf(n);
/*     */   }
/*     */   
/*     */   public String write(double d) {
/*  62 */     return String.valueOf(d);
/*     */   }
/*     */   
/*     */   public String write(char c) {
/*  66 */     return "\"" + c + "\"";
/*     */   }
/*     */   
/*     */   public String write(boolean b) {
/*  70 */     return String.valueOf(b);
/*     */   }
/*     */   
/*     */   private void value(Object object) {
/*  74 */     value(object, false);
/*     */   }
/*     */   
/*     */   private void value(Object object, boolean isApiModel) {
/*  78 */     if (object == null || cyclic(object)) {
/*  79 */       add((Object)null);
/*     */     } else {
/*  81 */       this.calls.push(object);
/*  82 */       if (object instanceof Class) {
/*  83 */         string(object);
/*  84 */       } else if (object instanceof Boolean) {
/*  85 */         bool(((Boolean)object).booleanValue());
/*  86 */       } else if (object instanceof Number) {
/*  87 */         add(object);
/*  88 */       } else if (object instanceof String) {
/*  89 */         string(object);
/*  90 */       } else if (object instanceof Character) {
/*  91 */         string(object);
/*  92 */       } else if (object instanceof Map) {
/*  93 */         map((Map<?, ?>)object);
/*  94 */       } else if (object.getClass().isArray()) {
/*  95 */         array(object, isApiModel);
/*  96 */       } else if (object instanceof Iterator) {
/*  97 */         array((Iterator)object, isApiModel);
/*  98 */       } else if (object instanceof Collection) {
/*  99 */         array(((Collection)object).iterator(), isApiModel);
/* 100 */       } else if (object instanceof Date) {
/* 101 */         date((Date)object);
/*     */       }
/* 103 */       else if (isApiModel) {
/* 104 */         model(object);
/*     */       } else {
/* 106 */         bean(object);
/*     */       } 
/* 108 */       this.calls.pop();
/*     */     } 
/*     */   }
/*     */   
/*     */   private boolean cyclic(Object object) {
/* 113 */     Iterator<Object> it = this.calls.iterator();
/* 114 */     while (it.hasNext()) {
/* 115 */       Object called = it.next();
/* 116 */       if (object == called)
/* 117 */         return true; 
/*     */     } 
/* 119 */     return false;
/*     */   }
/*     */   
/*     */   private void bean(Object object) {
/* 123 */     add("{");
/*     */     
/* 125 */     boolean addedSomething = false;
/*     */     try {
/* 127 */       BeanInfo info = Introspector.getBeanInfo(object.getClass());
/* 128 */       PropertyDescriptor[] props = info.getPropertyDescriptors();
/* 129 */       for (int i = 0; i < props.length; i++) {
/* 130 */         PropertyDescriptor prop = props[i];
/* 131 */         String name = prop.getName();
/* 132 */         Method accessor = prop.getReadMethod();
/* 133 */         if ((this.emitClassName || !"class".equals(name)) && accessor != null) {
/* 134 */           if (!accessor.isAccessible())
/* 135 */             accessor.setAccessible(true); 
/* 136 */           Object value = accessor.invoke(object, (Object[])null);
/* 137 */           if (value != null) {
/*     */             
/* 139 */             if (addedSomething)
/* 140 */               add(','); 
/* 141 */             add(name, value);
/* 142 */             addedSomething = true;
/*     */           } 
/*     */         } 
/* 145 */       }  Field[] ff = object.getClass().getFields();
/* 146 */       for (int j = 0; j < ff.length; j++) {
/* 147 */         Field field = ff[j];
/* 148 */         Object value = field.get(object);
/* 149 */         if (value != null)
/*     */         
/* 151 */         { if (addedSomething)
/* 152 */             add(','); 
/* 153 */           add(field.getName(), value);
/* 154 */           addedSomething = true; } 
/*     */       } 
/* 156 */     } catch (IllegalAccessException iae) {
/* 157 */       iae.printStackTrace();
/* 158 */     } catch (InvocationTargetException ite) {
/* 159 */       ite.getCause().printStackTrace();
/* 160 */       ite.printStackTrace();
/* 161 */     } catch (IntrospectionException ie) {
/* 162 */       ie.printStackTrace();
/*     */     } 
/* 164 */     add("}");
/*     */   }
/*     */   
/*     */   private void model(Object object) {
/* 168 */     add("{");
/* 169 */     boolean addedSomething = false;
/* 170 */     Field[] ff = object.getClass().getDeclaredFields();
/*     */     try {
/* 172 */       for (int i = 0; i < ff.length; i++) {
/* 173 */         Field field = ff[i];
/*     */         
/* 175 */         ApiField jsonField = field.<ApiField>getAnnotation(ApiField.class);
/* 176 */         ApiListField listField = field.<ApiListField>getAnnotation(ApiListField.class);
/*     */         
/* 178 */         if (listField != null) {
/*     */           
/* 180 */           PropertyDescriptor pd = new PropertyDescriptor(field.getName(), object.getClass());
/* 181 */           Method accessor = pd.getReadMethod();
/* 182 */           if (!accessor.isAccessible())
/* 183 */             accessor.setAccessible(true); 
/* 184 */           Object value = accessor.invoke(object, (Object[])null);
/* 185 */           if (value != null)
/*     */           
/* 187 */           { if (addedSomething)
/* 188 */               add(','); 
/* 189 */             add(listField.value(), value, true);
/* 190 */             addedSomething = true; } 
/* 191 */         } else if (jsonField != null) {
/*     */           
/* 193 */           PropertyDescriptor pd = new PropertyDescriptor(field.getName(), object.getClass());
/* 194 */           Method accessor = pd.getReadMethod();
/* 195 */           if (!accessor.isAccessible())
/* 196 */             accessor.setAccessible(true); 
/* 197 */           Object value = accessor.invoke(object, (Object[])null);
/* 198 */           if (value != null)
/*     */           
/* 200 */           { if (addedSomething)
/* 201 */               add(','); 
/* 202 */             add(jsonField.value(), value, true);
/* 203 */             addedSomething = true; } 
/*     */         } 
/*     */       } 
/* 206 */     } catch (IntrospectionException e1) {
/* 207 */       AlipayLogger.logBizError(e1);
/* 208 */     } catch (IllegalAccessException e2) {
/* 209 */       AlipayLogger.logBizError(e2);
/* 210 */     } catch (IllegalArgumentException e3) {
/* 211 */       AlipayLogger.logBizError(e3);
/* 212 */     } catch (InvocationTargetException e4) {
/* 213 */       AlipayLogger.logBizError(e4);
/*     */     } 
/* 215 */     add("}");
/*     */   }
/*     */   
/*     */   private void add(String name, Object value) {
/* 219 */     add(name, value, false);
/*     */   }
/*     */   
/*     */   private void add(String name, Object value, boolean isApiModel) {
/* 223 */     add('"');
/* 224 */     add(name);
/* 225 */     add("\":");
/* 226 */     value(value, isApiModel);
/*     */   }
/*     */   
/*     */   private void map(Map<?, ?> map) {
/* 230 */     add("{");
/* 231 */     Iterator<?> it = map.entrySet().iterator();
/* 232 */     while (it.hasNext()) {
/* 233 */       Map.Entry<?, ?> e = (Map.Entry<?, ?>)it.next();
/* 234 */       value(e.getKey());
/* 235 */       add(":");
/* 236 */       value(e.getValue());
/* 237 */       if (it.hasNext())
/* 238 */         add(','); 
/*     */     } 
/* 240 */     add("}");
/*     */   }
/*     */   
/*     */   private void array(Iterator<?> it) {
/* 244 */     array(it, false);
/*     */   }
/*     */   
/*     */   private void array(Iterator<?> it, boolean isApiModel) {
/* 248 */     add("[");
/* 249 */     while (it.hasNext()) {
/* 250 */       value(it.next(), isApiModel);
/* 251 */       if (it.hasNext())
/* 252 */         add(","); 
/*     */     } 
/* 254 */     add("]");
/*     */   }
/*     */   
/*     */   private void array(Object object) {
/* 258 */     array(object, false);
/*     */   }
/*     */   
/*     */   private void array(Object object, boolean isApiModel) {
/* 262 */     add("[");
/* 263 */     int length = Array.getLength(object);
/* 264 */     for (int i = 0; i < length; i++) {
/* 265 */       value(Array.get(object, i), isApiModel);
/* 266 */       if (i < length - 1)
/* 267 */         add(','); 
/*     */     } 
/* 269 */     add("]");
/*     */   }
/*     */   
/*     */   private void bool(boolean b) {
/* 273 */     add(b ? "true" : "false");
/*     */   }
/*     */   
/*     */   private void date(Date date) {
/* 277 */     if (this.format == null) {
/* 278 */       this.format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/* 279 */       this.format.setTimeZone(TimeZone.getTimeZone("GMT+8"));
/*     */     } 
/* 281 */     add("\"");
/* 282 */     add(this.format.format(date));
/* 283 */     add("\"");
/*     */   }
/*     */   
/*     */   private void string(Object obj) {
/* 287 */     add('"');
/* 288 */     CharacterIterator it = new StringCharacterIterator(obj.toString());
/* 289 */     for (char c = it.first(); c != Character.MAX_VALUE; c = it.next()) {
/* 290 */       if (c == '"') {
/* 291 */         add("\\\"");
/* 292 */       } else if (c == '\\') {
/* 293 */         add("\\\\");
/* 294 */       } else if (c == '/') {
/* 295 */         add("\\/");
/* 296 */       } else if (c == '\b') {
/* 297 */         add("\\b");
/* 298 */       } else if (c == '\f') {
/* 299 */         add("\\f");
/* 300 */       } else if (c == '\n') {
/* 301 */         add("\\n");
/* 302 */       } else if (c == '\r') {
/* 303 */         add("\\r");
/* 304 */       } else if (c == '\t') {
/* 305 */         add("\\t");
/* 306 */       } else if (Character.isISOControl(c)) {
/* 307 */         unicode(c);
/*     */       } else {
/* 309 */         add(c);
/*     */       } 
/*     */     } 
/* 312 */     add('"');
/*     */   }
/*     */   
/*     */   private void add(Object obj) {
/* 316 */     this.buf.append(obj);
/*     */   }
/*     */   
/*     */   private void add(char c) {
/* 320 */     this.buf.append(c);
/*     */   }
/*     */   
/* 323 */   static char[] hex = "0123456789ABCDEF".toCharArray();
/*     */   
/*     */   private void unicode(char c) {
/* 326 */     add("\\u");
/* 327 */     int n = c;
/* 328 */     for (int i = 0; i < 4; i++) {
/* 329 */       int digit = (n & 0xF000) >> 12;
/* 330 */       add(hex[digit]);
/* 331 */       n <<= 4;
/*     */     } 
/*     */   }
/*     */ }


/* Location:              C:\Users\Administrator\Downloads\jd-gui-windows-1.6.6\jd-gui-windows-1.6.6\alipay-sdk-1.1.jar!\com\alipay\api\interna\\util\json\JSONWriter.class
 * Java compiler version: 5 (49.0)
 * JD-Core Version:       1.1.3
 */